#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <mqueue.h>

mqd_t mqd;
static char *mq_name = "/xxx";  // /代表  /dev/mqueue目录

void *first_pthread(void *args)
{
    printf("第一个线程开始执行\n");
    if(mq_send(mqd, "hello 666", 13, 1) != -1)
    {
        printf("第一个线程发送消息成功\n");
    }
    else
    {
        printf("第一个线程发送消息失败\n");
    }
}

void *second_pthread(void *args)
{
    printf("第二个线程开始执行\n");
    char data_buff[100] = {0};
    ssize_t size = mq_receive(mqd, data_buff, 100, NULL);
    if(size > 0)
    {
        printf("接收到的消息为：%s, size=%ld\n", data_buff, size);
    }
    else
    {
        printf("接收消息失败, size=%ld\n", size);
    }
}


int main(int argc, char const *argv[])
{
    // 队列属性
    struct mq_attr attr;
    attr.mq_maxmsg = 10; // 最大消息数
    attr.mq_msgsize = 50; // 每条消息的最大字节数
    // 创建一个消息队列
    mqd = mq_open(mq_name, O_RDWR | O_CREAT, 0644, &attr);
    if (mqd == (mqd_t)-1)
    {
        printf("创建消息队列失败\n");
        return -1;
    }

    pthread_t pt1, pt2 = 0;
    pthread_create(&pt1, NULL, first_pthread, NULL);
    pthread_create(&pt2, NULL, second_pthread, NULL);

    pthread_join(pt1, NULL);
    pthread_join(pt2, NULL);

    mq_close(mqd);
    mq_unlink(mq_name);

    printf("main线程即将执行完毕\n");
    return 0;
}
